use std::io::{Read, Write};
use std::path::Path;
use todo_list::todo::TaskList;
use std::fs::{File, OpenOptions};

fn main() {
    let mut task_list = TaskList::new();

	// 判读文件是否存在
	let file_path = Path::new("./todo.json");
	if !file_path.exists() {
		let mut file = File::create(file_path).expect("创建文件失败!");
		let json_str = serde_json::to_string(&task_list).unwrap();
		file.write(json_str.as_bytes()).expect("写入文件失败!");
	}

	let mut file = OpenOptions::new().read(true).write(true).open(file_path).expect("打开文件失败!");
	let mut contents = String::new();
	file.read_to_string(&mut contents).expect("读取文件内容失败!");
	task_list = serde_json::from_str(&contents).expect("解析 JSON 失败!");

	loop {
		print_option();
		let mut input = String::new();
		print!("请输出选项: ");
		std::io::stdout().flush().expect("刷新标准输出失败！");
		std::io::stdin().read_line(&mut input).expect("读取数据失败!");
		match input.trim() {
			"1" => {
				print!("请输入任务标题: ");
				std::io::stdout().flush().expect("刷新标准输出失败!");
				let mut title = String::new();
				std::io::stdin().read_line(&mut title).expect("读取数据失败!");
				let title = title.trim().to_string();
				print!("请输入任务描述: ");
				std::io::stdout().flush().expect("刷新标准输出失败!");
				let mut description = String::new();
				std::io::stdin().read_line(&mut description).expect("读取数据失败!");
				let description = description.trim().to_string();
				let task = task_list.add_task(title, description);
				println!("添加任务ID: {}, 任务标题: {}, 成功", task.id, task.title);
			}
			"2" => {
				print!("请输入完成的任务ID: ");
				std::io::stdout().flush().expect("刷新标准输出失败!");
				let mut id = String::new();
				std::io::stdin().read_line(&mut id).expect("读取数据失败!");
				let id = id.trim().parse::<u32>().expect("不能转为u32类型!");
				let is_ok = task_list.finish_task(id);
				if is_ok {
					println!("任务ID: {}, 任务完成。", id);
				}
				else {
					println!("任务ID: {}, 任务完成失败。", id);
				}
			}
			"3" => {
				print!("请输入需要删除的任务ID: ");
				std::io::stdout().flush().expect("刷新标准输出失败!");
				let mut id = String::new();
				std::io::stdin().read_line(&mut id).expect("读取数据失败!");
				let id = id.trim().parse::<u32>().expect("不能转为u32类型!");
				task_list.remove_task(id);
			}
			"4" => {
				task_list.show_all_task();
			}
			"5" => {
				let json_str = serde_json::to_string(&task_list).unwrap();
				// println!("json string: {}", json_str);
				let mut file = OpenOptions::new().read(true).write(true).truncate(true).open(file_path).expect("打开文件失败!");
				file.write(json_str.as_bytes()).expect("写入数据到文件失败!");
			}
			"6" => {
				break;
			}
			_ => {
				println!("读取错误的数据!")
			}
		}	
	}
	println!("谢谢使用本任务管理系统~~~");
	println!("欢迎下次使用!!!Good-bye");
}

fn print_option() {
	println!("---------------------------------");
	println!("           任务管理系统           ");
	println!("---------------------------------");
	println!("           1. 添加任务            ");
	println!("           2. 完成任务            ");
	println!("           3. 删除任务            ");
	println!("           4. 显示任务            ");
	println!("           5. 保存任务            ");
	println!("           6. 退出系统            ");
	println!("---------------------------------");
	print!("请输入选项: ");
	std::io::stdout().flush().expect("刷新标准输出失败!");
}